<?php

namespace app\api\middleware;

use think\Request;

/*
 * 过滤请求参数
 */

class FilterRequest
{
    /**
     * @return mixed
     * @throws \Exception
     * @var \think\Request $request
     * @var mixed $next
     */
    public function handle(Request $request, \Closure $next)
    {
        $params         = $request->param();
        $filteredParams = $this->filterParams($params);
        if ($request->isPost()) {
            $request->withPost($filteredParams);
        } elseif ($request->isGet()) {
            $request->withGet($filteredParams);
        }
        return $next($request);
    }

    /**
     * 过滤参数
     * @param array $params
     * @return array
     */
    protected function filterParams(array $params)
    {
        $filteredParams = [];
        foreach ($params as $key => $value) {
            // 递归处理数组参数
            if (is_array($value)) {
                $filteredParams[$key] = $this->filterParams($value);
            } else {
                // 过滤恶意内容
                $filteredParams[$key] = $this->sanitizeInput($value);
            }
        }
        return $filteredParams;
    }

    /**
     * 过滤单个输入值
     * @param string $input
     * @return string
     */
    protected function sanitizeInput($input)
    {
        // 过滤 SQL 注入
        $input = $this->filterSqlInjection($input);
        // 过滤 XSS 攻击
        $input = $this->filterXss($input);
        // 其他过滤规则可以在这里添加
        return $input;
    }

    /**
     * 过滤 SQL 注入
     *
     * @param string $input
     * @return string
     */
    protected function filterSqlInjection($input)
    {
        // 移除 SQL 注入常见的关键字
        $sqlKeywords = [
            'select', 'insert', 'update', 'delete', 'drop', 'truncate', 'union', 'exec', 'script', '--', '/*', '*/'
        ];
        $input       = str_ireplace($sqlKeywords, '', $input);
        return $input;
    }

    /**
     * 过滤 XSS 攻击
     *
     * @param string $input
     * @return string
     */
    protected function filterXss($input)
    {
        // 移除 HTML 和 JavaScript 标签
        $input = strip_tags($input);
        // 转义特殊字符
        $input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
        return $input;
    }

}
